home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / recio212.zip / rcgett.c < prev    next >
C/C++ Source or Header  |  1995-01-29  |  4KB  |  101 lines

  1. /*****************************************************************************
  2.    MODULE: rcgett.c
  3.   PURPOSE: recio column delimited time input functions
  4. COPYRIGHT: (C) 1994-1995, William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.12
  8.   RELEASE: January 29, 1995
  9. *****************************************************************************/
  10.  
  11. #include <ctype.h>
  12. #include <errno.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <time.h>
  17.  
  18. #include "recio.h"
  19.  
  20. extern int _risready(REC *rp, int mode);
  21. extern char *_rfldstr(REC *rp, size_t len);
  22. extern char *_rerrs(REC *rp, int errnum);
  23.  
  24. #define rtmfmt(rp) ((rp)->r_tmfmt)
  25. #define rcol(rp) (rp->r_colno)
  26.  
  27. extern int _rgett_c_warno;
  28. extern void _tminit(struct tm *);
  29.  
  30. /****************************************************************************/
  31. struct tm                    /* return broken-down time                     */
  32.     rcgettm(                 /* get time from col delim record stream       */
  33.         REC *rp,             /* record pointer                              */
  34.         size_t begcol,       /* field inclusive beginning column            */
  35.         size_t endcol)       /* field inclusive ending column               */
  36. /****************************************************************************/
  37. {
  38.     struct tm t;             /* return broken-down time */
  39.     struct tm val;           /* conversion value */
  40.     char *fldptr;            /* pointer to field buffer */
  41.     char *fldp;              /* another pointer to field buffer */
  42.  
  43.     _tminit(&t);
  44.     if (_risready(rp, R_READ)) {
  45.       if (endcol >= begcol && begcol >= rbegcolno(rp)) {
  46.         rcol(rp) = begcol - rbegcolno(rp);
  47.         fldptr = _rfldstr(rp, endcol-begcol+1);
  48.         if (fldptr) {
  49.           for (;;) {
  50.             for (fldp=fldptr; *fldp; fldp++) {if (!isspace(*fldp)) break;}
  51.             if (*fldp) {
  52.               val = sftotm(fldp, rtmfmt(rp));
  53.               if (errno) {
  54.                 switch (errno) {
  55.                 case ERANGE:
  56.                   fldptr = _rerrs(rp, R_ERANGE);
  57.                   break;
  58.                 case EINVAL:
  59.                   fldptr = _rerrs(rp, R_EINVAL);
  60.                   break;
  61.                 case EINVDAT:
  62.                   fldptr = _rerrs(rp, R_EINVDAT);
  63.                   break;
  64.                 }
  65.                 if (fldptr) { continue; } else { goto done; } 
  66.               } else {
  67.                 t = val;
  68.                 if (_rgett_c_warno) rsetwarn(rp, _rgett_c_warno);
  69.                 goto done;
  70.               }
  71.             } /* missing data */ 
  72.             fldptr = _rerrs(rp, R_EMISDAT); 
  73.             if (fldptr) { continue; } else { goto done; } 
  74.           }
  75.         }
  76.       } /* column args reversed or tried to start before first column */
  77.       rseterr(rp, R_EINVAL);
  78.     }
  79. done:
  80.     return t;
  81. }
  82.  
  83. /****************************************************************************/
  84. time_t                       /* return time (-1=error)                      */
  85.     rcgett(                  /* get time from col delim record stream       */
  86.         REC *rp,             /* record pointer                              */
  87.         size_t begcol,       /* field inclusive beginning column            */
  88.         size_t endcol)       /* field inclusive ending column               */
  89. /****************************************************************************/
  90. {
  91.     time_t time=(time_t) -1; /* return time (-1 = error) */
  92.     struct tm t;             /* broken-down time */
  93.  
  94.     t = rcgettm(rp, begcol, endcol);
  95.     if (_risready(rp, R_READ)) {
  96.         time = tmtotime(t);
  97.         if (time == (time_t) -1) rseterr(rp, R_ERANGE);
  98.     }
  99.     return time;
  100. }
  101.